home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turnbull China Bikeride
/
Turnbull China Bikeride - Disc 2.iso
/
ACORNUSERS
/
CBSA
/
EDUCATION
/
MENU
/
cc
/
WimpMenu
< prev
next >
Wrap
Text File
|
1998-02-28
|
3KB
|
147 lines
//-----------------------------------
// WimpMenu.c
//-----------------------------------
#include <string.h>
#include <os.h>
#include <trap.h>
#include "WimpError.h"
#include "WimpMenu.h"
MenuItem::MenuItem(char * itemtext)
{
flags=0;
submenu = -1;
icon_flags = 0x7000021;
strncpy(text,itemtext,12);
}
MenuItem::MenuItem(char * itemtext, WimpWindow &w)
{
flags=0;
window_handle = w.data->handle;
icon_flags = 0x7000021;
strncpy(text,itemtext,12);
}
MenuItem::MenuItem(char * itemtext, WimpMenu &m)
{
flags=0;
submenu = (int) &m.data;
icon_flags = 0x7000021;
strncpy(text,itemtext,12);
}
MenuItem::MenuItem(WimpIcon &i)
{
flags=0;
submenu = -1;
icon_flags = i.flags;
indirect_sprite.sprite = i.indirect_sprite.sprite;
indirect_sprite.sprite_area = i.indirect_sprite.sprite_area;
indirect_sprite.isname = i.indirect_sprite.isname;
}
MenuItem::~MenuItem()
{
}
WimpMenu::WimpMenu(char *mtitle, int nb_entries)
{
if (nb_entries < 1) throw ("WimpMenu::WimpMenu@inferior1");
data = (parameters *) new char[sizeof(parameters) +
sizeof(MenuItem)*(nb_entries-1)];
index = 0;
nb_items = nb_entries;
strncpy(data->title, mtitle, 12);
data->title_fcolor = 7;
data->title_bcolor = 2;
data->work_fcolor = 7;
data->work_bcolor = 0;
data->item_width = strlen(mtitle);
data->item_height = 44;
data->item_gap = 0;
data->item[0].flags = MenuItem::LAST;
data->item[0].submenu = -1;
data->item[0].icon_flags = 0x7000021;
data->item[0].text[0] = '\0';
}
WimpMenu::~WimpMenu()
{
delete data;
}
void WimpMenu::realloc(int n_entry)
{
int n,i;
parameters *dt;
dt = (parameters *) new char[sizeof(parameters)
+ sizeof(MenuItem)*(n_entry-1)];
n = n_entry;
if (nb_items < n) n = nb_items;
memcpy(dt,data,sizeof(parameters));
for(i=0;i<n;i++) dt->item[i] = data->item[i];
delete data;
data = dt;
if(index>n) index = n;
nb_items = n_entry;
}
WimpMenu &WimpMenu::operator << (MenuItem &mi)
{
if (index >= nb_items) realloc(nb_items+1);
if (index > 0) data->item[index-1].flags &= !(MenuItem::LAST);
data->item[index] = mi;
data->item[index++].flags |= MenuItem::LAST;
return *this;
}
WimpMenu &WimpMenu::operator << (char *text)
{
if (index >= nb_items) realloc(nb_items+1);
if (index > 0) data->item[index-1].flags &= !(MenuItem::LAST);
data->item[index].flags = MenuItem::LAST;
data->item[index].submenu = -1;
data->item[index].icon_flags = 0x7000021;
strncpy(data->item[index++].text,text,12);
return *this;
}
MenuItem &WimpMenu::operator[] (int i)
{
return data->item[i];
}
MenuItem &WimpMenu::operator[] (char *t)
{
int i,exit;
for(i=0; ((i<index) && !exit); i++) exit = strcmp(data->item[i].text,t);
return data->item[i];
}
void WimpMenu::open(int x0, int y0)
{
int r[10];
os_error *e;
r[1] = (int) data;
r[2] = x0;
r[3] = y0;
if ((e = os_swi(Wimp_CreateMenu, r)) != NULL) throw(e);
}
void WimpMenu::close()
{
int r[10];
os_error *e;
r[1] = -1;
if ((e = os_swi(Wimp_CreateMenu, r)) != NULL) throw(e);
}